package com.cuz.daileetcode.utils.unionsearchset;

import java.util.Objects;

/**
 * @author cuzz
 * @version 1.0
 * @description: 用户存储的元素
 * 为什么要包一层 避免用户重写的hashCode和equals影响我们并查集的结果
 * 包一层 让UnionSearchSet 使用默认的hashCode 和equals
 * <p>
 * 举例
 * 对应一个人有名字 chenxing，另外一个人也是这个名子 如果 person类重写了hashcode 和equals
 * 任务 名字相关的人相同  那么将对我们的并查集造成影响。
 * <p>
 * 影响指： 并查集初始化的时候需要直到所有的数据样本，一开始加入叫chengxing的人是对象a
 * 后面叫chengxing的人是对象b a一开始加入并查集了，但是b 没有 ，如果这个时候人这个类
 * 重写了hashCode 那么不使用Element 会让程序以为b对象属于并查集，这是不对的
 * @date 22:32 2021/12/25
 **/
public class Element<T> {

    /***
     * 元素，指需要加入到并查集的数据
     */
    private T data;

    private Element(T data) {
        this.data = data;
    }

    private Element() {
    }

    protected static <T> Element<T> of(T data) {
        return new Element<>(data);
    }

    /***
     * 只是取自己的hashCode 哦 和 data无关
     * @return hashCode
     */
    @Override
    public int hashCode() {
        return Objects.hashCode(this);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Element)) {
            return false;
        }
        Element<?> element = (Element<?>) o;
        return Objects.equals(data, element.data);
    }
}
